package com.study.config;

import com.study.annotation.CheckLicence;
import com.study.enums.LicenceEnum;
import com.study.exception.LicenceRuntimeException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author CSDN 流放深圳
 * @description 拦截器
 * @create 2024-04-13 15:55
 * @since 1.0.0
 */
@Configuration
public class LicenceInterceptor extends HandlerInterceptorAdapter {

    /**
     * 是否校验所有业务的 Licence
     * 可以通过配置来修改
     */
    @Value("${licence.checkAll:true}")
    private Boolean CHECK_ALL;

    /**
     * 全局定义许可证书校验的枚举类
     */
    public static LicenceEnum licenceEnum;

    /**
     * 前置处理
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //过滤非方法的请求
        if (!(handler instanceof HandlerMethod)) {
            return super.preHandle(request, response, handler);
        }

        /*
        根据业务需求来做，如果 checkAll = false 只是某几个核心业务需要校验 Licence，则需要在核心业务的 Controller 层增加 @CheckLicence 注解。
        如果全部的业务都需要校验 Licence，则加不加注解都要校验，加注解只是多此一举
        默认所有业务都校验 Licence
        */
        if(!CHECK_ALL){//非全部校验，则需要判断是否添加了注解。如果未添加，直接放行
            //获取方法上的注解
            HandlerMethod method = (HandlerMethod) handler;
            CheckLicence methodAnnotation = method.getMethodAnnotation(CheckLicence.class);
            if (methodAnnotation == null){
                return super.preHandle(request, response, handler);
            }
        }

        //判断是否校验通过
        if(null == licenceEnum){
            throw new LicenceRuntimeException(LicenceEnum.NOT_FOUND.getDes());
        }

        //除了成功之外，其它都要抛异常，由全局捕捉异常给用户提示
        if(! LicenceEnum.SUCCESS.getCode().equals(licenceEnum.getCode())){
            throw new LicenceRuntimeException(licenceEnum.getDes());
        }

        return super.preHandle(request, response, handler);
    }

}
